/**
 * @copyright Copyright (c) 2025 
 * CSG Digital Grid Technology (Guangdong) Co., Ltd.
 * @author xxxcsg
 * @brief OpenHarmony 系统硬件信息采集工具（命令行程序）
 * @details 通过命令行参数控制，采集系统硬件、软件配置及参数信息，支持 JSON/TXT 格式输出与展示，核心功能如下：
 *          1. 信息采集范围：
 *             - 基础硬件信息：CPU 架构、总内存/空闲内存（MB）、root/userdata 分区空闲存储（MB）
 *             - 系统配置参数：通过 begetctl param dump 命令解析指定/所有 param: 前缀参数（如系统版本、芯片类型、设备序列号等）
 *             - 兼容性标识：默认添加 compatibility_check=true 标识
 *          2. 命令行参数控制：
 *             - -a：全量采集（配合其他参数使用，控制输出形式）
 *             - -l：仅采集 params 数组中指定的系统配置参数（过滤无关参数）
 *             - -j：在终端打印 JSON 格式的完整采集结果
 *             - -t：在终端打印 TXT 格式（键=值）的采集结果
 *             - -h：显示帮助信息
 *          3. 输出能力：
 *             - 自动保存 JSON 文件到 /userdata/sysphinfo.json
 *             - 自动转换并保存 TXT 文件到 /userdata/sysphinfo.txt（依赖 jsontotxtfile 模块）
 *             - 支持短选项合并（如 -jt 同时打印 JSON 和 TXT 格式）
 * @note 1. 依赖组件：cJSON 库（JSON 序列化）、标准 C 库（文件/进程操作）、自定义模块（sysphinfohelp、sysphutil、paramparse、jsontotxtfile）
 *       2. 命令依赖：需系统支持 begetctl 命令（用于获取系统参数）、cat 命令（用于打印 TXT 文件内容）
 *       3. 配置参数列表：params 数组固化了常用系统参数名，可根据需求增删调整采集的参数项
 *       4. 单位说明：内存和存储大小均以 MB 为单位输出，便于阅读
 * @attention 1. 运行权限：需确保程序具备 /userdata 目录读写权限、begetctl 命令执行权限
 *            2. 依赖模块：paramparse 负责解析系统参数，jsontotxtfile 负责 JSON 转 TXT，需确保相关头文件和实现正确关联
 *            3. 参数优先级：-l 选项生效时，仅采集 params 数组中的指定参数；未指定 -l 时，采集所有解析到的 param: 前缀参数
 *            4. 错误处理：begetctl 命令执行失败时，仅缺失系统配置参数，基础硬件信息仍可正常采集和输出
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <cJSON.h>
#include <sys/utsname.h>
#include <sys/statvfs.h>

#include <sys/stat.h>
#include <fcntl.h>

#include "sysphinfohelp.h"
#include "sysphutil.h"
#include "paramparse.h"
#include "jsontotxtfile.h"

void getbegetctl(int uselist, cJSON* root) {
    const char* params[] = {
        "const.ohos.releasetype",
        "const.ohos.apiversion",
        "const.ohos.serial",
        "const.ohos.fullname",
        "const.build.chiptype",
        "const.build.product",
        "const.product.manufacturer",
        "const.product.brand",
        "const.product.name",
        "const.product.ipc.version",
        "const.product.ID",
        "const.product.esn",
        "const.product.model",
        "const.product.software.version",
        "const.product.device.type",
        "const.product.firmware.version",
        "const.product.devicetype",
        "const.product.hardwareversion",
        "const.product.incremental.version",
        "const.product.firstapiversion",
        "const.software.model",
        "const.SystemCapability.Kernel.Linux"
    };
    int param_count = sizeof(params) / sizeof(params[0]);
    //printf("getbegetctl-----------1\n");
    // 调用begetctl命令并获取输出
    FILE* pipe = popen("begetctl param dump", "r");
    if (!pipe) {
        perror("Failed to run command");
        return 1;
    }
    
    char line[256];
    while (fgets(line, sizeof(line), pipe)) {
        if (strstr(line, "param:")) {
            //printf("getbegetctl-----------%s\n", line);
            parse_param(uselist, line, params, param_count, root);
        }
    }
    pclose(pipe);
}


int main(int argc, char *argv[]) {

    if(argc < 2) {
        print_help();
        return 0;
    }

    int pall = 0, plist = 0, pjson = 0, ptxt = 0;
    int opt;
    opterr = 0; // 禁止getopt自动报错
    // 解析选项
    for (int i = 1; i < argc; i++) {
        char *arg = argv[i];
        // 检查是否是选项(以'-'开头)
        if (arg[0] == '-') {
            if (arg[1] && arg[2] && arg[2] != '-') {
                for (int j = 1; j < strlen(arg); j++) {
                    switch (arg[j]) {
                        //case 'a': pall = 1; pjson = 1; ptxt = 1; break;
                        case 'a': pall = 1; break;
                        case 'l': plist = 1; break;
                        case 'j': pjson = 1; break;
                        case 't': ptxt = 1; break;
                        case 'h': print_help(); return 0;
                        default: printf("Unknown option: %c\n", arg[j]);
                    }
                }
            }
            else {
                //if (strcmp(arg, "-a") == 0) { pall = 1; pjson = 1; ptxt = 1;}
                if (strcmp(arg, "-a") == 0) pall = 1;
                if (strcmp(arg, "-l") == 0) plist = 1;
                if (strcmp(arg, "-j") == 0) pjson = 1;
                if (strcmp(arg, "-t") == 0) ptxt = 1;
                if (strcmp(arg, "-h") == 0) { print_help(); return 0; }
            }
        }
        else {
            // 这里可以添加处理参数的逻辑
            printf("Unknown option: %s\n", arg);
        }
    }

    // 收集系统信息
    char* arch = get_arch();
    unsigned long total_mem = 0, free_mem = 0;
    get_memory(&total_mem, &free_mem);
    unsigned long free_storage_root = get_storage_root();
    unsigned long free_storage_userdata = get_storage_userdata();
    //char* version = get_harmony_version();

    // 创建JSON对象
    cJSON *root = cJSON_CreateObject();
    cJSON_AddStringToObject(root, "architecture", arch);
    cJSON_AddNumberToObject(root, "total_memory_mb", total_mem);
    cJSON_AddNumberToObject(root, "free_memory_mb", free_mem);
    cJSON_AddNumberToObject(root, "free_storage_root_mb", free_storage_root);
    cJSON_AddNumberToObject(root, "free_storage_userdata_mb", free_storage_userdata);
    //cJSON_AddStringToObject(root, "harmonyos_version", version);
    cJSON_AddTrueToObject(root, "compatibility_check");

    getbegetctl(plist, root);

    printf("System Information:\n pall = %d, ptxt = %d, pjson = %d, plist = %d \n", pall, ptxt, pjson, plist);
    char *json_str = cJSON_Print(root);
    if(pjson == 1) {
        // 打印信息
        printf("System Information:\n%s\n", json_str);
    }
        // 保存到文件
    FILE *fp = fopen("/userdata/sysphinfo.json", "w");
    if (fp) {
        fputs(json_str, fp);
        fclose(fp);
    }

    parse_to_txtfile(json_str);

    if(ptxt == 1) {
        //printf("sysphinfo.txt内容:\n");
        system("cat /userdata/sysphinfo.txt");
    }

    // 释放资源
    free(arch);
    //free(version);
    free(json_str);
    cJSON_Delete(root);
    return 0;
}
